package progetto;

import javax.swing.*;
import javax.swing.border.Border;

import progetto.misure.Misuratore;
import progetto.misure.MisureUtil;
import progetto.socialnetwork.GrafoTwitter;
import progetto.visualizzazione.Visualizzatore;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;

public class Controller extends JFrame {
	
	private JPanel scrollArea;
	private JPanel estrazionePanel;
	private JPanel misurePanel;
	private JPanel visonePanel;

	private JTable Misure; // Tabella misure
	private JTable Grafico; //Spazio per il grafico del grafo
	private JButton estraiButton, estraiDaRete, misureButton, graficoButton; 
	
	//private TextArea estraiText;
	private TextArea misureText;

	private GrafoTwitter grafoTwitter;
	private Misuratore misuratore;

	public Controller() {
		// TODO Auto-generated constructor stub
		
			super("Controller");
			inizializzaGUI();
		}
		
		public void inizializzaGUI(){

			Container c = getContentPane();
			
			//start screen layout
			scrollArea = new JPanel();
			estrazionePanel= new JPanel();
			misurePanel= new JPanel();
			visonePanel= new JPanel();
			estrazionePanel.setBackground(Color.magenta);
			misurePanel.setBackground(Color.magenta);
			
			//estraiText= new TextArea();
			//estraiText.setEditable(false);
			//estrazionePanel.add(estraiText);
			misureText= new TextArea();
			misureText.setEditable(false);
			misurePanel.add(misureText);
			
			
			
			estraiButton = new JButton("Estrai Grafo (Da File)");
			estraiButton.setBackground(Color.ORANGE);
			estraiButton.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					grafoTwitter = GrafoTwitter.loadData();
					JOptionPane.showMessageDialog(Controller.this, "Grafo creato correttamente");

				}
			});
			
			
			estraiDaRete= new JButton("Estrai Grafo (Da Rete)");
			estraiDaRete.setBackground(Color.ORANGE);
			estraiDaRete.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					int n=50;
					boolean finito=false;
					while (!finito){
					try{
						String res=
						JOptionPane.showInputDialog(Controller.this, "Inserisci il numero di nodi da estrarre");								
						n=Integer.valueOf(res);
						finito=true;
					} catch (Exception ex){finito=false;}
					}
					// TODO Auto-generated method stub
					grafoTwitter = new GrafoTwitter(n);
					JOptionPane.showMessageDialog(Controller.this, "Grafo creato correttamente");

				}
			});
			
			graficoButton = new JButton("Esporta per visualizzazione");
			graficoButton.setBackground(Color.ORANGE);
			graficoButton.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					Visualizzatore v=new Visualizzatore(grafoTwitter, misuratore);
					JFileChooser jfc=new JFileChooser();
					jfc.setApproveButtonText("Seleziona il file");
					jfc.setDialogTitle("Esporta");
					int res = jfc.showOpenDialog(Controller.this);
					if (res != JFileChooser.APPROVE_OPTION) {
						return;
					}
					String path=jfc.getSelectedFile().getAbsolutePath();
					v.exportDotFile(path);
					v.exportXmlFile(path);
				}
			});
			
			misureButton = new JButton("Calcola Misure");
			misureButton.setBackground(Color.ORANGE);
			misureButton.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					Misuratore misuratore = new Misuratore(grafoTwitter);
					Controller.this.misuratore=misuratore;
					//double [] hits= misuratore.getHits();
					long t0= System.currentTimeMillis();
					double [] beetwen = misuratore.getBetween();
					double [] hits = misuratore.getHits();
					double [] pageRank = misuratore.getPageRank();
					double [] boundedBetween = misuratore.getBoundedBetween(10);
					
					
					StringBuilder vettori= new StringBuilder();

					vettori.append("Between\n");
					for (int i=0; i<beetwen.length; i++){
						vettori.append(beetwen[i] + " ");
					}
					
					vettori.append("\nHits\n");
					for (int i=0; i<hits.length; i++){
						vettori.append(hits[i] + " ");
					}

					vettori.append("\npageRank\n");
					for (int i=0; i<pageRank.length; i++){
						vettori.append(pageRank[i] + " ");
					}
					
					
					vettori.append("\nboundedBetween\n");
					for (int i=0; i<boundedBetween.length; i++){
						vettori.append(boundedBetween[i] + " ");
					}
					
					
					misureText.setText(vettori.toString());
					

					MisureUtil.printArray(beetwen);
					long t1=System.currentTimeMillis();
					System.out.println();
					System.out.println("tempo beetwen");
					System.out.println(t1-t0);
					
					long t2=System.currentTimeMillis();
					System.out.println();
					System.out.println("tempo hits");
					System.out.println(t2-t0);
					
					long t3=System.currentTimeMillis();
					System.out.println();
					System.out.println("tempo pageRank");
					System.out.println(t3-t0);

				}
			});
			
			scrollArea.add(estraiButton);
			scrollArea.add(estraiDaRete);
			scrollArea.add(misureButton);
			scrollArea.add(graficoButton);
			
			c.add(scrollArea, BorderLayout.NORTH);
			c.add(estrazionePanel, BorderLayout.CENTER);
			c.add(misurePanel, BorderLayout.SOUTH);
			
			validate();
			
			setSize(1190, 480);			
			setVisible(true);	
		
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
		// TODO Auto-generated method stub
		
		UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
		Controller app = new Controller();
		
		app.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e){
				System.exit(0);
				
			}
		});
		
	}}
